package com.example.pictureManage.service.mainViewService.imageBoxHelp;

import com.example.pictureManage.service.mainViewStage;
import com.example.pictureManage.util.FileUtil;
import com.example.pictureManage.util.menuManage;
import com.example.pictureManage.util.vboxManage;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * 图片选择器
 */
public class selectService {
    //缓存上一个选中的选项

    //管理器  管理选中的vbox
    private final vboxManage mange = new vboxManage();

    //管理器  菜单的内容
    private final menuManage mMange = new menuManage();

    private final Set<String> fileStr = new HashSet<>();

    public vboxManage getMange() {
        return mange;
    }

    public menuManage getMMange() {
        return mMange;
    }

    public selectService(){
        String[] itemStr = {"复制","粘贴","重命名","删除"};
        for(var item:itemStr){
            mMange.addMenuItem(item);
        }
    }

    //左键处理
    public void primaryClick(MouseEvent event, VBox vBox){
        //双击打开图片交由上一层打开   因为归类在上一层合理一些

        //单击选中
        if (event.getButton() == MouseButton.PRIMARY){

            //不是多选操作
            Map<String,VBox> vBoxs = mange.getSelectVbox();
            if (!event.isControlDown()){
                //不是多选操作所以选中的只有一个,所以要清空
                mange.ClearVBox();
                // 没有Ctrl键而且点击了其他图片
                vBox.setStyle("-fx-background-color:lightblue");
                //推送到缓存池里面
                vBoxs.put((String) vBox.getUserData(),vBox);
            }
            //是多选操作
            else{
                //先前选中过
                if (vBoxs.containsValue(vBox)){
                    vBoxs.remove(vBox.getUserData().toString());
                    vBox.setStyle("-fx-background-color:none");
                }
                //先前没有选中该元素
                else{
                    vBoxs.put(vBox.getUserData().toString(),vBox);
                    vBox.setStyle("-fx-background-color:lightblue");
                }
            }
            //非空
            if (!vBoxs.isEmpty()){
                // 准备文件个数和总大小
                int fileNum = 0;
                double fileSize = 0;

                // 遍历所有选中的文件
                for (var item : vBoxs.entrySet()){
                    try {
                        //准备数据
                        URI uri = new URI(item.getKey());
                        Path path = Paths.get(uri);
                        File file = path.toFile();
                        //如果是图片文件
                        if (FileUtil.isImageFile(path)){
                            fileNum++;
                            fileSize+=file.length();
                        }
                    } catch (URISyntaxException e) {
                        throw new RuntimeException(e);
                    }
                }
                //获取下方的标签要素
                Label fileDetailLabel = mainViewStage.getFileDetailLabel();
                fileSize /= 1000.0;
                //舍去
                DecimalFormat decimalFormat = new DecimalFormat("0.00");
                String resFileSize = decimalFormat.format(fileSize);
                //设置
                fileDetailLabel.setText("已选中图片:"+fileNum+"文件大小为:"+resFileSize+"kB");
            } else {
                mainViewStage.getFileDetailLabel().setText("");
            }
        } else {
            mainViewStage.getFileDetailLabel().setText("");
        }
    }

    /**
     * @param event 点击事件
     * @serialData 2025/2/6
     *
     * */
    //右键处理器
    public void RightClick(MouseEvent event){
        //确定点击的是右键
        if(event.getButton() == MouseButton.SECONDARY){


            //添加关于  “复制” 选项的监听器
            mMange.addHandler("复制",e->{
                //复制  也就是从选中的几个图片中取到文件的路径 缓存下来(fileStr)  所以要从选中管理器中得到路径
                // 选中管理器的结构是： key:filepath -- vbox实例
                fileStr.clear();
                for(var item:mange.getSelectVbox().entrySet()){
                    fileStr.add(item.getKey());
                }
            });



            //这里阻塞进程会不会好点
            mMange.addHandler("粘贴",e->{

                //当前文件夹的目录
                String str = mainViewStage.getFileNode().getFilePath().toString();

                //从复制的缓存里面获得
                for(var item:fileStr){
                    //获取到源文件

                    try {
                        //获取源文件
                        Path sourcePath = Paths.get(new URI(item));
                        //加载目标路径
                        Path desPath = Paths.get(str,sourcePath.getFileName().toString());

                        //准备基础数据
                        int Count = 1;
                        String fileName = desPath.getFileName().toString();
                        //获取文件基础名称
                        String baseName = fileName.substring(0,fileName.lastIndexOf('.'));
                        //获取后缀名
                        String extension = fileName.substring(fileName.lastIndexOf('.'));
                        while (Files.exists(desPath)){
                            String newFileName = baseName + Count + extension;
                            desPath = sourcePath.resolveSibling(newFileName);
                            Count++;
                        }
                        //复制操作
                        Files.copy(sourcePath, desPath, StandardCopyOption.REPLACE_EXISTING);
                    }
                    catch (Exception ex){
                        mMange.getContextMenu().hide();
                        throw new RuntimeException(ex);
                    }
                }
                mainViewStage.reload();
            });
            //添加关于删除的处理器
            mMange.addHandler("删除",e->{
                //提示框  是否删除？
                Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
                alert.setTitle("提示");
                alert.setHeaderText(null);
                alert.setContentText("确认删除?");
                Optional<ButtonType> type = alert.showAndWait();
                //判断结果
                if(type.isPresent() && type.get() == ButtonType.OK) {
                    for (var item : mange.getSelectVbox().entrySet()) {
                        try {
                            Files.deleteIfExists(Paths.get(new URI(item.getKey())));
                        } catch (Exception ex) {
                            mMange.getContextMenu().hide();
                            throw new RuntimeException(ex);
                        }
                    }
                }
                mainViewStage.reload();
            });

            //添加关于重命名的处理器
            mMange.addHandler("重命名",e->{
                int i = 0;
                String[] userInput = new String[1];
                Stage dialogStage = new Stage();
                dialogStage.initModality(Modality.APPLICATION_MODAL);
                dialogStage.setTitle("自定义输入对话框");

                Label label = new Label("请输入内容:");
                final TextField[] textField = {new TextField()};
                Button okButton = new Button("确定");
                okButton.setOnAction(e1 -> {
                    userInput[0] = textField[0].getText();
                    dialogStage.close();
                });

                VBox dialogLayout = new VBox(label, textField[0], okButton);
                dialogLayout.setPadding(new Insets(10));
                dialogLayout.setSpacing(10);

                Scene dialogScene = new Scene(dialogLayout, 250, 150);
                dialogStage.setScene(dialogScene);
                dialogStage.showAndWait();


                for(var item:mange.getSelectVbox().entrySet()) {
                    try {
                        //重命名操作
                        FileUtil.reNameFiles(item.getKey(),userInput[0],mange.getSelectVbox().size(), i);
                        i++;
                    }
                    catch (Exception ex){
                        mMange.getContextMenu().hide();
                        throw new RuntimeException(ex);
                    }
                }
                mainViewStage.reload();
            });
            //展示菜单栏
            mMange.getContextMenu().show(mainViewStage.getTilePane(),event.getScreenX(),event.getScreenY());
        }
    }
}
